package org.example.utils;

import lombok.extern.slf4j.Slf4j;
import org.example.config.PropertiesConfig;
import org.example.exception.UploadException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Objects;

/**
 * 文件上传工具类
 */
@Slf4j
public class FileUploadUtil {

    // 默认文件最大50M
    private static long DEFAULT_MAX_SIZE = 50*1024*1024;
    // 默认文件名称长度为100
    private static long DEFAULT_MAX_NAME_LENGTH = 100;
    // 默认上传地址
    private static String defaultBaseDir = PropertiesConfig.getUploadFileDir();

    public static final String[] DEFAULT_ALLOWED_EXTENSION = {
            // 图片
            "bmp", "gif", "jpg", "jpeg", "png",
            // word excel powerpoint
            "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
            // 压缩文件
            "rar", "zip", "gz", "bz2",
            // 视频格式
            "mp4", "avi", "rmvb",
            // pdf
            "pdf"
    };
    public static final String[] IMAGE_ALLOWED_EXTENSION = {
            // 图片
            "bmp", "gif", "jpg", "jpeg", "png"
    };



    public static String upload(MultipartFile file) throws IOException {
        return upload(defaultBaseDir,file,DEFAULT_ALLOWED_EXTENSION);
    }

    public static String upload(MultipartFile file,String[] allowedExtension) throws IOException {
        return upload(defaultBaseDir,file,allowedExtension);
    }


    /**
     *
     * @param baseDir 上传的路径
     * @param file  文件
     * @param allowedExtension 指定格式的文件
     * @return
     *  校验 文件名长度 文件大小  文件类型
     */
    public static String upload(String baseDir,MultipartFile file,String[] allowedExtension) throws IOException {
        int length = Objects.requireNonNull(file.getOriginalFilename()).length();
        // 判断文件名长度
        log.warn("上传文件的名字长度为:"+length);
        if (length > FileUploadUtil.DEFAULT_MAX_NAME_LENGTH){
            throw new UploadException("文件名最大长度为:"+FileUploadUtil.DEFAULT_MAX_NAME_LENGTH);
        }
        // 判断文件大小
        log.warn("上传文件的大小为:"+file.getSize()/1024+"kb");
        if (file.getSize() > FileUploadUtil.DEFAULT_MAX_SIZE){
            throw new UploadException("文件最大为:"+FileUploadUtil.DEFAULT_MAX_SIZE/1024/1024+"M");
        }
        // 判断文件类型
        log.warn("上传文件的类型是:"+getFileExtension(file));
        if (!FileUploadUtil.isAllowedExtension(file,allowedExtension)){
            throw new UploadException("上传文件的格式不正确,请上传:"+ Arrays.toString(allowedExtension)+"格式!!!");
        }
        // 生成上传的文件名  加入时间戳得到上传的文件名,避免重复
        String fileName = getFileName(file)+"_"+System.currentTimeMillis()+"."+getFileExtension(file);
        // 生成上传的绝对路径  File.separator: 路径符号 '/'
        File fileDir = new File(baseDir+File.separator + fileName);
        // 文件夹是否存在,不存在便创建
        if (!fileDir.getParentFile().exists()){
            fileDir.getParentFile().mkdirs();
        }
        file.transferTo(fileDir);

        return fileDir.getAbsolutePath();
    }

    public static String transformUrl(String url){
        try{
            url = new File(url).getAbsolutePath();
            String baseUrl = url.replace(new File(PropertiesConfig.getUploadDir()).getAbsolutePath(),"").replaceAll("\\\\","/");
            return PropertiesConfig.getAccessPath() + "upload" + baseUrl;
        }catch (Exception e){
            throw new UploadException("上传文件夹异常!!!");
        }
    }


    // 判断是否符合上传文件类型
    public static boolean isAllowedExtension(MultipartFile file,String[] allowedExtension){
        String extension = FileUploadUtil.getFileExtension(file);
        for (String item : allowedExtension){
            if (extension.equalsIgnoreCase(item)){ // 忽略大小写
                return true;
            }
        }
        return false;
    }

    // 得到文件的类型
    public static String getFileExtension(MultipartFile file){
        String fileName = file.getOriginalFilename();
        // 截取文件的类型,  若文件没有'.',则会返回fileName
        if (fileName.lastIndexOf(".") == -1){
            return file.getContentType().substring(file.getContentType().lastIndexOf("/")+1);
        }
        String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
        return extension;
    }

    /**
     * 获取去除文件类型的文件名称
     * @param file
     * @return
     */
    public static String getFileName(MultipartFile file){
        String fileName = file.getOriginalFilename();
        if (fileName.lastIndexOf(".") == -1){
            return fileName.replaceAll(" ","");
        }
        return fileName.substring(0, fileName.lastIndexOf("."));
    }
}
